﻿using System;
using System.IO;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;


namespace Cliente
{
    /*
     * Objeto que representa un mensaje a enviar
     * este es serializado a XML para ser tratado por el servidor y cliente
     * El formato es:
     * 	<?xml version="1.0" encoding="utf-8"?>
     *		<Mensaje xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     *		<contenido>Bienvenido al servidor</contenido>
     *		<buffer>QmllbnZlbmlkbyBhbCBzZXJ2aWRvcg==</buffer>
     *		<clientID>003c1e79-b5a7-4f1b-8530-a57ff364556b</clientID>
     *		<videoID>0</videoID>
     *  </Mensaje>
     * Si videoID es distinto de cero el mensaje esta pidiendo un video al servidor
     */


    [XmlRoot("Mensaje")]
    public class Mensaje
    {

        public enum MsgType
        {
            MSG, LIST, VIDEO, IMG, ERROR
        }
        [XmlElement("Tipo")]
        public MsgType tipo;
        [XmlElement("contenido")]
        public String contenido;
        [XmlElement("clientID")]
        public Guid clientID;


        [XmlIgnore]
        private String archivo;

        /*
         * Constructor
         * genera el nombre de archivo basado en el id del cliente
         */
        public Mensaje(Guid id)
        {
            archivo = Directory.GetCurrentDirectory() + "/xml/serialize" + id + ".xml";
        }//Mensaje

        /*
         * Constructor generico
         */
        public Mensaje()
        {
            archivo = Directory.GetCurrentDirectory() + "/xml/serialize" + DateTime.Now.Millisecond.ToString() + ".xml";
        }//Mensaje

        /*
         * Metodo de Serializado
         * genera el archivo XML basado en el objeto
         */
        public void Serialize()
        {
            XmlSerializer xs = new XmlSerializer(this.GetType());
            FileStream f = new FileStream(archivo, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
            TextWriter tw = new StreamWriter(f);
            xs.Serialize(tw, this);
            tw.Close();
        }//Serialize

        /*
         * Metodo de Serializado
         * genera un archivo XML basado en el objeto
         * identico al anterior pero genera un archivo
         * llamado recibido+clientID
         * usado para almacenar la informacion recibida
         */
        public void RSerialize()
        {
            XmlSerializer xs = new XmlSerializer(this.GetType());
            string ar = Directory.GetCurrentDirectory() + "/xml/recibido" + clientID + ".xml";
            FileStream f = new FileStream(ar, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);

            TextWriter tw = new StreamWriter(f);
            xs.Serialize(tw, this);
            tw.Close();
        }//RSerialize

        /*
         * Metodo estatico para deserializar un archivo
         * transformandolo en un objeto Mensaje
         * @param String archivo a deserializar
         * @param Guid id del cliente
         * @return Objeto Mensaje
         */
        public static Mensaje Deserialize(String file, Guid id)
        {
            Mensaje mensaje = new Mensaje();
            TextReader tr = new StreamReader(file);
            XmlSerializer xs = new XmlSerializer(typeof(Mensaje));
            mensaje = (Mensaje)xs.Deserialize(tr);
            tr.Close();
            return mensaje;
        }//Deserialize

        /*
         * Metodo estatico para deserializar un archivo
         * transformandolo en un objeto Mensaje
         * @param Stream stream que contiene la informacion a deserializar
         * @return Objeto Mensaje
         */
        public static Mensaje Deserialize(Stream stream)
        {
            Mensaje mensaje = new Mensaje();
            StreamReader sr = new StreamReader(stream);
            XmlSerializer xs = new XmlSerializer(typeof(Mensaje));
            mensaje = (Mensaje)xs.Deserialize(sr);
            sr.Close();
            return mensaje;
        }//Deserialize

        /*
         * Retorna el nombre de archivo
         */
        public String getFile()
        {
            return archivo;
        }//getFile

    }
}